package traveler.tools;

import java.util.HashMap;

import traveler.tools.ExtendedAlertDialog;

import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.widget.ViewFlipper;


/**
 * Classe utilitaire
 * 
 * @author gounlaf
 */
public class Tools {
    /** Instance pour singleon */
    private static Tools instance = null;

    /** Constantes de classes */
    public static final int ERROR = -1;
    public static final int TEXTVIEW = 1;
    public static final int EDITTEXT = 2;
    public static final int BUTTON = 3;
    public static final int LINEARLAYOUT = 4;
    public static final int ALERTDIALOG = 5;
    public static final int EXTENDEDALERTDIALOG = 6;
    public static final int FLIPPER = 7;
    public static final int TOGGLEBUTTON = 8;
    public static final int PREF_RESET = 9;
    public static final int RELATIVELAYOUT = 10;
    public static final int RADIOBUTTON = 10;

    /**
     * HashMap pour récupérer la correspondance entre une classe et un entier
     * pour faire du Switch
     */
    private HashMap<String, Integer> classAsInt; 

    /**
     * Constructeur en privé ; ne pourra etre instancié hors de la classe Doit
     * passer obligatoire par getInstance()
     */
    private Tools() {
        this.classAsInt = new HashMap<String, Integer>();
        this.classAsInt.put(TextView.class.toString(), Tools.TEXTVIEW);
        this.classAsInt.put(EditText.class.toString(), Tools.EDITTEXT);
        this.classAsInt.put(Button.class.toString(), Tools.BUTTON);
        this.classAsInt.put(LinearLayout.class.toString(), Tools.LINEARLAYOUT);
        this.classAsInt.put(AlertDialog.class.toString(), Tools.ALERTDIALOG);
        this.classAsInt.put(ExtendedAlertDialog.class.toString(),
                Tools.EXTENDEDALERTDIALOG);
        this.classAsInt.put(ViewFlipper.class.toString(), Tools.FLIPPER);
        this.classAsInt.put(ToggleButton.class.toString(), Tools.TOGGLEBUTTON);
        this.classAsInt.put("pref_reset", Tools.PREF_RESET);
        this.classAsInt.put(RelativeLayout.class.toString(), Tools.RELATIVELAYOUT);
        this.classAsInt.put(RadioButton.class.toString(), Tools.RADIOBUTTON);
    }

    /**
     * Le mot-clé synchronized empêche toute instanciation multiple même par
     * différents threads. Retourne l'instance du singleton.
     */
    public final synchronized static Tools getInstance() {
        if (Tools.instance == null) {
            Tools.instance = new Tools();
        }

        return Tools.instance;
    }

    /**
     * Retourne un entier à partir du nom d'une classe (pour les switch)
     * @param className
     * @return
     */
    public int classNameToInt(String className) {
        if(this.classAsInt.containsKey(className)) {
            return this.classAsInt.get(className);
        } else {
            return Tools.ERROR;
        }
    }

    /**
     * Permet d'obtenir l'état du stockage externe Modification à venir : un
     * return pour chaque état ?
     * 
     * @return true si le stockage en lecture et écriture
     */
    public static boolean getExternalStorageState() {
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        } else {
            return false;
        }
    }
    
    public int getHMSAsSeconds(int hours, int minutes, int seconds) {
        Log.d("Tools::getHMSAsSeconds","h : "+hours);
        Log.d("Tools::getHMSAsSeconds","m : "+minutes);
        Log.d("Tools::getHMSAsSeconds","s : "+seconds);
        return (hours * 3600 + minutes * 60 + seconds);
    }
    
    /**
     * 
     * @param imageURI
     * @param maxWidth Largeur max en DP
     * @param maxHeight Hauteur max en DP
     * @return
     */
    public static Bitmap resizeImageForFavicon(String imageURI, int maxWidth, int maxHeight) {
        Bitmap r = null;
        
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;
        Bitmap imgSource = BitmapFactory.decodeFile(imageURI, options);
        
        int imgWidth = imgSource.getWidth();//1280
        int imgHeight = imgSource.getHeight();//1024
        
        int targetWidth = maxWidth;//150
        int targetHeight = maxHeight;//150
        
        // Redimensions si necessaire
        if(imgWidth > maxWidth || imgHeight > maxHeight) {//OUI
            float ratio = (float)imgWidth/(float)imgHeight;
            // 1,25
            
            // 150/150 > 1.25 -> faux
            if(targetWidth/targetHeight > ratio) {
                // Largeur > hauteur
                targetWidth = (int)(targetHeight*ratio);
            } else {
                // -> hauteur = 150/1.25 => 120
                // Largeur < Hauteur
                targetHeight = (int)(targetWidth/ratio);
            }
        }
        
        r = Bitmap.createScaledBitmap(imgSource, targetWidth, targetHeight, false);

        return r;
    }
}